package cn.zcj.studytest.utils;

import cn.zcj.studytest.domain.SignUp;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class JwtUtil {

    private static final long EXPIRE_TIME = 1000 * 60 * 60 * 24;

    //设置私钥
    public static final String TOKEN_SECRET = "aa082c-66rt89-29sr3t-y9t7b8";


    /**
     * 创建携带自定义信息和声明的自定义私钥的jwt
     *
     * @return jwt串
     */
    public static String creatJwt(SignUp signUp) {
        //构建头部信息
        Map<String, Object> header = new HashMap<>();
        header.put("typ", "JWT");
        header.put("alg", "HS256");

        //根据私钥构建密钥信息
        Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);

        //根据当前用户密码构建密钥信息

        //设置过期时间为当前时间一天后
        Date nowDate = new Date();
        Date expireDate = new Date(System.currentTimeMillis() + EXPIRE_TIME);

        return JWT.create().withHeader(header)
                .withClaim("userId", signUp.getId())//业务信息:员工号
                .withClaim("username", signUp.getUsername())//业务信息:员工姓名
                .withClaim("rolename", "default")//业务信息:角色
                .withIssuer("SERVICE")//声明,签名是有谁生成 例如 服务器
                .withNotBefore(nowDate)//声明,定义在什么时间之前，该jwt都是不可用的
                .withExpiresAt(expireDate)//声明, 签名过期的时间
                .sign(algorithm);

    }


    public static Long checkToken(String token) {
        try {
            DecodedJWT decodeJwt = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).build().verify(token);
            return decodeJwt.getClaim("userId").asLong();
        } catch (Exception e) {
            log.error("鉴权失败， e = ", e);
            return null;
        }
    }
}
